Методы вычисления квадратных корней
Методы вычисления квадратных корней — это вычислительные алгоритмы для вычисления приближённых значений главных (или неотрицательных) квадратных корней (обычно обозначаемых как , или ) вещественного числа. Арифметически это означает, что если дано число , процедура находит число, которое при умножении на себя даёт . Алгебраически это означает процедуру нахождения неотрицательного корня уравнения . Геометрически это означает построение стороны квадрата с заданной площадью.
Любое положительное вещественное число имеет два корня[1]. Главное значение квадратного корня большинства положительных вещественных чисел является иррациональным числом с бесконечной последовательностью десятичных цифр. Как результат, десятичное представление любого такого квадратного корня может быть вычислено только приближённо с конечной точностью (знаков после запятой). Однако, даже если мы берём корень от полного квадрата целого числа, так что результат имеет конечное представление, некоторые процедуры, используемые для вычисления корня, могут вернуть лишь ряд приближений с возрастающей точностью.
Представление вещественного числа в виде цепной дроби может быть использовано вместо десятичного или двоичного разложения и это представление имеет свойство, что квадратный корень любого рационального числа (который не является полным квадратом) имеет период, то есть периодическое разложение, похожее на то, как рациональные числа имеют повторяющееся разложения десятичной системе счисления.
Большинство общепризнанных аналитических методов являются итеративными и состоят из двух шагов: нахождения подходящего начального значения с последующим итеративным уточнением пока не будет достигнут определённый критерий остановки. Начальным значением может быть любое число, но если оно ближе к конечному значению, число требуемых итераций потребуется меньше. Наиболее известным таким методом, да ещё и удобным для программирования, является метод Ньютона, который основывается на вычислении производной. Несколько методов, такие как обычное деление вручную по схеме Горнера или разложение в ряд, не требуют задание начального значения. В некоторых приложениях требуется найти целочисленный квадратный корень, который является квадратным корнем, округлённым до ближайшего целого (в этом случае может быть использована модифицированная процедура).
Используемый метод зависит от того, как результат будет использован (то есть, насколько точен должен быть результат) и какие средства есть под рукой. Методы можно грубо разбить на те, которые можно выполнить в уме, которые требуют карандаша и листа бумаги, или те, которые реализуются в виде программы и выполняются на компьютерах или других вычислительных устройствах. Могут приниматься в расчёт скорость сходимости (сколько итераций потребуется для достижения заданной точности), вычислительной сложности отдельных операций (таких как деление) или итераций, и распределение ошибок (точность результата).
Процедуры поиска квадратных корней (в частности, корня из 2) известны по меньшей мере со времён древнего Вавилона (17-й век до нашей эры). Метод Герона из Египта первого века был первым проверяемым алгоритмом для вычисления квадратного корня. Современные аналитические методы начались разрабатываться после принятия арабских цифр в Западной Европе в Раннем Ренессансе. В настоящие дни почти все вычислительные устройства имеют функцию быстрого и точного вычисления квадратного корня в виде встроенной конструкции языка программирования, библиотечной функции или аппаратного оператора, которые основываются на описанных ниже процедурах.
Начальная оценка
[править | править код]Многие итеративные алгоритмы вычисления квадратного корня требуют задания начального случайного значения. Это значение должно быть ненулевым положительным числом. Оно должно быть между 1 и , числом, квадратным корень которого мы ищем, поскольку квадратный корень должен быть в этих пределах. Если начальное значение очень далеко от корня, алгоритму потребуется больше итераций. Если начать с (или с ), будет отработано лишних примерно итераций просто для получения порядка корня. Поэтому полезно иметь грубую оценку корня, которая может иметь слабую точность, но зато легко вычисляется. В общем случае чем точнее оценка, тем быстрее сходимость. Для метода Ньютона (называемого также вавилонским или методом Герона), начальное значение несколько большее корня даёт более быструю сходимость, по сравнению с начальным значением, меньшим корня.
Вообще говоря, оценка рассматривается на произвольном интервале, в котором известно, что в нём содержится корень (таком как ). Получение лучшей оценки вовлекает либо получение более узких границ интервала, либо лучшего функционального приближения к Последнее обычно означает использование для аппроксимации многочленов более высокого порядка, хотя не все аппроксимации используют многочлены. Общие методы оценки бывают скалярные, линейные, гиперболические и логарифмические. Десятичная система счисления обычно используется для оценки в уме или на бумаге. Двоичная система счисления более пригодна для компьютерных оценок. При оценке экспонента и мантисса обычно обрабатываются отдельно.
Десятичная оценка
[править | править код]Обычно число выражается в экспоненциальном виде как , где , а n — целое число, тогда оценкой возможного квадратного корня может быть , где .
Скалярные оценки
[править | править код]Скалярные методы делят весь диапазон на интервалы и оценка в каждом интервале представлена одним числом. Если диапазон рассматривается как один интервал, то арифметическое среднее (5,5) или геометрическое среднее ( являются приемлемыми оценками. Абсолютная и относительная оценка для этих оценок будет отличаться. В общем случае отдельное число будет очень неточно. Более точные оценки разбивают диапазон на два и более интервалов, но скалярная оценка продолжает оставаться очень грубой.
Для двух интервалов, разбитых геометрически, квадратный корень можно оценить как[2].
Эта оценка имеет максимальную абсолютную погрешность в точке = 100 и максимальную относительную ошибку в 100% в точке = 1.
Например, для с разложением , оценка будет . , с абсолютной ошибкой 246 и относительной ошибкой почти 70%.
Линейная оценка
[править | править код]Лучшей оценкой и стандартным методом является линейное приближение функции на малой дуге. Если, как и выше, степень выделена из числа , а интервал сокращён до , можно использовать секущую или касательную где-то вдоль дуги для аппроксимации, но прямая регрессии метода наименьших квадратов будет более точной.
Прямая, получающаяся методом наименьших квадратов, минимизирует среднее расстояние между оценкой и значением функции. Её уравнение — . После преобразования и округления коэффициентов для упрощения вычислений получим
Это лучшая оценка в среднем, которую можно получить одной попыткой линейной аппроксимации функции в интервале . Оценка имеет максимальную абсолютную ошибку 1,2 в точке a=100 и максимальную относительную ошибку в 30% в точках S=1 и 10[3].
Чтобы разделить на 10, вычитаем единицу из показателя степени или, образно говоря, передвигаем десятичную запятую на одну позицию влево. Для этой формулы любая добавленная константа, равная 1 плюс маленькое приращение, даёт удовлетворительную оценку, так что запоминать точное число нет необходимости. Аппроксимация (округлённая или не округлённая) с помощью одной прямой, стягивающей область по точности даёт не более одного верного знака. Относительная ошибка более чем 1/22, так что даёт менее 2 битов информации. Точность сильно ограничена, поскольку область охватывает два порядка, что достаточно большая величина для такого рода оценок.
Существенно лучшую оценку можно получить при помощи кусочно–линейной аппроксимации, то есть с помощью нескольких отрезков, которые приближают поддугу исходной дуги. Чем больше отрезков используется, тем лучше приближение. Наиболее употребительно применение касательных. Критичным моментом является как делить дугу и где располагать точки касания. Действенным методом деления дуги от y=1 до y=100 является геометрический — для двух интервалов границей интервалов является квадратный корень исходного интервала, 1*100, то есть и . Для трёх интервалов будут кубические корни — , и , и так далее. Для двух интервалов является очень удобным числом. Легко получить касательные прямые в точках касания и . Их уравнения: и . Обращая уравнения, получим, что квадратные корни равны и . Тогда для :
Максимальные абсолютные значения оказываются в правых границах интервалов, в точках a=10 и 100, и равны 0,54 и 1,7 соответственно. Максимальные относительные ошибки появляются на концах интервалов, в точках a=1, 10 и 100, и равны 17%. 17% или 0,17. Они больше, чем 1/10, так что метод даёт точность менее одной значащей цифры.
Гиперболическая оценка
[править | править код]В некоторых случаях может оказаться действенной гиперболическая оценка, поскольку гипербола также является выпуклой кривой и может лежать вдоль дуги Y = x2 лучше, чем прямая. Гиперболическая оценка вычислительно более сложная, поскольку для неё нужно деление на число с плавающей запятой. Почти оптимальной гиперболической аппроксимацией к x2 на интервале является . После преобразования получим . Тогда для :
Деление с плавающей запятой должно быть с точностью до одного десятичного знака, поскольку вся оценка даёт такую точность, и такое деление можно выполнить в уме. Гиперболическая оценка в среднем лучше, чем скалярная или линейная оценка. Её максимальная абсолютная ошибка составляет 1,58 в точке 100, а максимальная относительная ошибка составляет 16,0% в точке 10. Для худшего случая a=10 оценка равна 3,67. Если начать с 10 и применять итерации Нютона-Рапсона напрямую, требуется две итерации, которые дают 3,66, прежде чем достичь точности гиперболической оценки. Для более типичного случая наподобие 75 гиперболическая оценка даёт 8,00 и требуется 5 итераций Ньютона-Рапсона с начальным значением 75, чтобы получить более точный результат.
Арифметическая оценка
[править | править код]Метод, аналогичный кусочно-линейной аппроксимации, но использующий лишь арифметические операции вместо алгебраических уравнений, использует таблицу умножения в обратную сторону — квадратный корень чисел между 1 и 100 где-то между 1 и 10, так что, поскольку мы знаем, что 25 является точным квадратом (5 × 5) и 36 является точным квадратом (6 × 6), то квадратный корень из числа, которое больше 25, но меньше 36, начинается с цифры 5. Аналогично для чисел между другими квадратами. Этот метод даёт правильный первый знак, но точность его всего одна цифра — первая цифра квадратного корня из 35, например, равна 5, но сам корень из 35 почти равен 6.
Лучше делить интервал между двумя квадратами пополам. Так что корень любого числа между 25 и половины пути до 36 (что есть 30,5) оценивается как 5, остальные числа, большие 30,5 вплоть до 36 оцениваются как 6[4]. Процедура требует очень мало арифметики для нахождения середины двух произведений из таблицы. Вот таблица таких чисел:
a | nearest square | est. |
---|---|---|
1 to 2,5 | 1 (= 12) | 1 |
2,5 to 6,5 | 4 (= 22) | 2 |
6,5 to 12,5 | 9 (= 32) | 3 |
12,5 to 20,5 | 16 (= 42) | 4 |
20,5 to 30,5 | 25 (= 52) | 5 |
30,5 to 42,5 | 36 (= 62) | 6 |
42,5 to 56,5 | 49 (= 72) | 7 |
56,5 to 72,5 | 64 (= 82) | 8 |
72,5 to 90,5 | 81 (= 92) | 9 |
90,5 to 100 | 100 (= 102) | 10 |
Конечной операцией будет умножение оценки k на степень десятки, делённой пополам, так что для ,
Метод даёт точность в одну значащую цифру, поскольку он округляет до лучшей первой цифры.
Метод можно распространить до 3 значащих цифр в большинстве случаев, интерполируя между ближайшими квадратами. Если , то примерно равен k плюс дробь, равная разности a и , делённой на разность между двумя квадратами:
- где
Конечной операцией, как и выше, служит умножение результата на степень десятки, делённой пополам
Число k есть десятичная цифра, а R есть дробь, которую следует превратить в десятичную. Дробь имеет обычно одну цифру в числителе и одну или две цифры в знаменателе, так что преобразование в десятичную дробь можно провести в уме.
Пример: найти квадратный корень из 75. , так что a равно 75, а n равно 0. Исходя из таблицы умножения квадратный корень мантиссы должен быть 8 с дробью, поскольку , а , слишком велико. Так что k равно 8 с дробью является десятичным представлением R. Дробь R имеет в числителе и в знаменателе. 11/17 чуть меньше, чем 12/18, что равно 2/3 или 0,67, так что 0,66 является хорошим предположением (здесь можно ограничиться и предположением поскольку ошибка мала). Так что оценка корня равна . √75 до трёх значащих цифр будет 8,66, так что оценка до трёх значащих цифр хорошая. Не все оценки с помощью такого метода столь точны, но они довольно близки.
Двоичная оценка
[править | править код]Когда работа ведётся в двоичной системе счисления (скажем, в процессоре компьютера), выражается как , где , квадратный корень можно оценить величиной
что является регрессией методом наименьших квадратов по 3 старшим битам. имеет максимальную абсолютную ошибку 0,0408 в точке =2 и максимальную относительную ошибку в 3,0% в точке =1. Для вычислений удобна округлённая оценка (поскольку коэффициенты являются степенями 2)
которая имеет максимальную абсолютную ошибку 0,086 в точке 2 и максимальную относительную ошибку в 6,1% в точках и .
Для двоичное приближение даёт Поскольку , оценка даёт абсолютную ошибку в 19 и относительную ошибку 5,3%. Относительная ошибка чуть меньше 1/24, так что приближение даёт точность до 4+ бит.
Оценку для с точностью до 8 бит можно получить путём просмотра таблицы по старшим 8 битам , учитывая, что старший бит задаётся неявно в большинстве представлений чисел с плавающей запятой, а младшие биты после 8 бит должны быть округлены. Таблица содержит 256 байт заранее вычисленных 8-битных квадратных корней. Например, для индекса 111011012, что в десятичной системе равно 1,851562510, значение в таблице равно 101011102, что в десятичной системе равно 1,35937510, квадратному корню числа 1,851562510 с точностью до 8 бит (2+ десятичных знака).
Вавилонский метод
[править | править код]Возможно первым алгоритмом, используемым для аппроксимации , является метод, известный как вавилонский метод, несмотря на то, что нет никаких прямых свидетельств, за исключением гипотетических умозаключений, что вавилонские математики использовали этот метод[6]. Метод известен также как метод Герона, по имени греческого математика первого столетия Герона, который дал первое явное описание метода в своей работе 60 года Метрика[7].Основная методика заключается в том, что если x больше квадратного корня неотрицательного вещественного числа S то будет меньше корня и наоборот. Так что среднее этих двух чисел резонно ожидать более близким к корню (формальное доказательство этого факта основывается на неравенстве о среднем арифметическом, геометрическом и гармоническом, которое показывает, что это среднее всегда больше квадратного корня, что обеспечивает сходимость). Метод эквивалентен использованию метода Ньютона для решения уравнения .
Точнее, если x является начальным приближением для , а ошибка в нашей оценке, такая что , мы можем раскрыть скобки и получим
- поскольку .
Следовательно, мы можем компенсировать ошибку и обновить нашу старую оценку
Поскольку вычисленная ошибка не была точной, она станет нашим следующим приближением. Процесс обновления продолжается пока не достигнем нужной точности. Это алгоритм с квадратичной сходимостью, что означает, что число верных цифр приближения (грубо говоря) удваивается с каждой итерацией. Работает он так:
- Начинаем с любого положительного начального значения (чем ближе к истинному квадратному корню числа S, тем лучше).
- Положим равным среднему между и (используем среднее арифметическое для аппроксимации среднего геометрического).
- Повторяем шаг 2 пока не достигнем нужной точности.
Алгоритм можно представить следующим образом:
Алгоритм работает также хорошо и для p-адических чисел, но не может быть использован для отождествления вещественных квадратных корней с p-адичными квадратными корнями. Можно, например, построить последовательность рациональных чисел, полученных этим методом, которая сходится к +3 в случае вещественных чисел, но к -3 в 2-адичных числах.
Пример
[править | править код]Для вычисления √S, где S = 125348, с точностью до шести значащих цифр используем метод грубой оценки, описанный выше
Поэтому .
Сходимость
[править | править код]Предположим, что x0 > 0 и S > 0. Тогда для любого n xn > 0. Относительная ошибка[англ.] xn определена как
а тогда
Теперь можно показать, что
а следовательно
а отсюда следует гарантированная сходимость и эта сходимость квадратичная.
Сходимость в худшем случае
[править | править код]Если использовать метод грубой оценки с вавилонским методом, то наихудшие случаи точности в нисходящей последовательности:
А тогда в любом случае
Ошибки округления ослабляют сходимость. Рекомендуется хранить по меньшей мере одну лишнюю цифру выше желаемой точности xn, чтобы минимизировать ошибки округления.
Метод Бакхшали
[править | править код]Этот метод для поиска приближения квадратного корня был написан в древнеиндийской рукописи, называемой манускриптом Бакхшали. Метод эквивалентен двум итерациям вавилонского метода с начальным значением x0. Таким образом, алгоритм является квадратично сходящимся, что означает, что число верных знаков приближения увеличивается примерно в четыре раза с каждой итерацией[8]. Представление алгоритма в современной нотации следующее: Следует вычислить , пусть x02 будет начальным приближением к корню S. Последовательно выполняются итерации
Это можно использовать для построения рационального приближения к квадратному корню, начав с целого числа. Если — это целое число, выбранное так, что близко к S, и — это разность, абсолютная величина которой минимизируется, то первую итерацию можно записать следующим образом:
Метод Бакхшали может быть обобщён для вычисления произвольного корня, включая дробные корни[9].
Пример
[править | править код]Используем тот же пример, что был приведён для вавилонского метода. Пусть Тогда первая итерация даёт
Аналогично вторая итерация даёт
Цифра за цифрой
[править | править код]Это метод последовательного поиска каждой цифры квадратного корня. Метод медленнее вавилонского, но имеет некоторые преимущества
- Он проще для вычислений вручную.
- Каждый найденный знак корня заведомо верный, то есть он не будет изменён на следующих итерациях.
- Если представление квадратного корня имеет конечное число цифр, алгоритм завершается после последней найденной цифры. Таким образом, он может быть использован для проверки, что данное число является полным квадратом.
- Алгоритм работает в любой системе счисления, и естественно, работа алгоритма зависит от выбранной системы счисления.
Палочки Непера включают дополнительные средства для выполнения этого алгоритма. Алгоритм вычисления n-го корня цифра за цифрой[англ.] является обобщением этого метода.
Основной принцип
[править | править код]Рассмотрим сначала случай нахождения квадратного корня из числа Z, являющегося квадратом двузначного числа XY, где X — это цифра десятков, а Y — цифра единиц. Имеем:
Сначала определим значение X. X — это наибольшая цифра, такая что X2 не превосходит Z, от которого отброшены две последние цифры.
На следующей итерации соединяем пару цифр, умножая X на 2 и помещая результат в позицию десятков, а затем пытаемся найти, чему же равно Y.
Поскольку в нашем случае ответом является точный квадратный корень, алгоритм останавливается.
Та же идея может быть распространена на вычисление произвольного квадратного корня. Представим, что мы можем найти квадратный корень из N как сумму n положительных чисел, таких что
Путём многократного использования тождества
правую часть можно представить в виде
Это выражение позволяет нам найти квадратный корень последовательным подбором значений . Предположим, что числа уже подобраны, тогда m-й член задаётся выражением , где является найденным приближением к квадратному корню. Теперь каждый новый подбор должен удовлетворять рекурсии
так что для всех при начальном значении Если найден точный квадратный корень. Если нет, то сумма даёт подходящую аппроксимацию к квадратному корню и будет ошибкой аппроксимации.
Например, в десятичной системе мы имеем
где являются указателями положения цифр, а коэффициенты . На каждом m-м шаге вычисления квадратного корня находится приближённый квадратный корень. Величина и суммируемые члены задаются формулами
Поскольку указатели положения имеют чётную степень 10, нам нужно работать только с парой старших цифр в оставшемся члене на любом m-м шаге. Раздел ниже систематизирует эту процедуру.
Очевидно, что подобный метод может быть использован для вычисления квадратного корня в любой системе счисления, не обязательно в десятичной. Например, нахождение цифра за цифрой квадратного корня в двоичной системе довольно эффективно, поскольку значение ищется в малом наборе цифр {0,1}. Это делает вычисление более быстрым, поскольку на каждом шаге значение либо равно для , либо для . Факт, что имеется всего две возможности для также делает проще процесс выбора значения на m-м шаге вычислений. Это потому, что нам нужно лишь проверить, что для Если это условие выполняется, мы берём ; а если не выполняется, то берём Также факт, что умножение на 2 осуществляется сдвигом влево, помогает при вычислениях.
Десятичная система счисления
[править | править код]Запишем исходное число в десятичном виде. Числа, записываются по аналогии алгоритму деления столбиком, и, как и в длинном делении, квадратный корень будет писаться в верхней строке. Теперь разобьём цифры на пары, начиная с запятой, в обе стороны от неё. Десятичная запятая квадратного корня будет на десятичной запятой квадрата. Одна цифра квадратного корня записывается над парой цифр квадрата.
Начиная с крайне левой позиции выполняем следующую процедуру для каждой пары цифр:
- Сносим вниз старшую пару ещё неиспользованных цифр (если все цифры использованы, пишем "00") и записываем их справа от остатка предыдущего шага (на первом шаге остатка нет). Другими словами, умножаем остаток на 100 и добавляем две цифры. Это будет текущим значением c.
- Находим p, y и x следующим образом:
- Пусть будет частью уже найденного корня при игнорировании десятичной запятой. (Для первого шага, p = 0.)
- Определяем наибольшую цифру , такую что . Мы будем использовать новую переменную .
- Заметим, что — это просто удвоенное p с дописанной к нему справа цифрой x.
- Заметим, что x можно найти случайным угадыванием, чему должно равняться c/(20•p), с пробным вычислением y, затем x берётся выше или ниже в зависимости от результата.
- Помещаем цифру в качестве следующей цифры корня, то есть над парой цифр квадрата, которые только что спустили вниз. Теперь следующее значение p получается из старого значения по формуле .
- Вычитаем y из c для образования нового остатка.
- Если остаток равен нулю и нет больше цифр, которые можно спустить вниз, алгоритм останавливается. В противном случае возвращаемся на шаг 1 и выполняем следующую итерацию.
Примеры
[править | править код]Находим квадратный корень из 152,2756.
1 2. 3 4 / \/ 01 52,27 56 01 1*1 <= 1 < 2*2 x = 1 01 y = x*x = 1*1 = 1 00 52 22*2 <= 52 < 23*3 x = 2 00 44 y = (20+x)*x = 22*2 = 44 08 27 243*3 <= 827 < 244*4 x = 3 07 29 y = (240+x)*x = 243*3 = 729 98 56 2464*4 <= 9856 < 2465*5 x = 4 98 56 y = (2460+x)*x = 2464*4 = 9856 00 00 Алгоритм останавливается: Ответ 12,34
Двоичная система счисления
[править | править код]Этот раздел использует формализм раздела «Вычисление цифра за цифрой» с небольшими изменениями, что , а каждое равно или .
Теперь мы пробегаем по всем от вниз до и строим приближённое решение в виде суммы всех , для которых мы найдём значение.
Чтобы определить, равно ли значению или , мы берём . Если (то есть квадрат нашего приближения включая не превосходит исходного квадрата), то полагаем , в противном случае полагаем и .
Чтобы избежать возведения в квадрат на каждом шаге, мы запоминаем разность и обновляем её на каждой итерации, полагая с .
Первоначально мы устанавливаем для наибольшего с .
В качестве дополнительной оптимизации сохраняем и , два члена в случае, когда не нуль, в отдельных переменных , :
и можно эффективно обновлять на каждом шаге:
Заметим, что
- , что является конечным результатом, возвращаемым функцией, представленной ниже.
Реализация алгоритма на языке C[10]:
int32_t isqrt(int32_t n) { assert(("входное значение должно быть неотрицательным", n > 0)); int32_t x = n; // int32_t c = 0; // // начинается с наибольшей степени четырёх <= n int32_t d = 1 << 30; // Второй старший бит устанавливаем в 1. // То же самое, что ((unsigned)INT32_MAX + 1) / 2. while (d > n) d >>= 2; while (d != 0) // для { if (x >= c + d) // если , то { x -= c + d; // c = (c >> 1) + d; // } else c >>= 1; // d >>= 2; // } return c; // }
Можно реализовать более быстрый алгоритм как в двоичной, так и в десятичной системе счисления, если использовать таблицы для выбора, то есть реализация принципа использование больше памяти сокращает время исполнения[11].
Экспоненциальное тождество
[править | править код]Карманные калькуляторы обычно реализуют хорошие программы вычисления экспоненты и натурального логарифма. Вычисление квадратного корня S тогда производится с помощью свойств логарифмов () и экспоненты ():
Или в более общем случае:
Знаменатель дроби n соответствует степени корня. В случае квадратного корня знаменатель равен 2. То же самое тождество используется для вычисления квадратного корня с помощью таблиц логарифмов или логарифмических линеек.
Такой метод вычисления квадратного корня удобен для калькуляторов, поскольку они обычно не критичны ко времени выполнения операции. Однако ресурсоемкость данного метода делает его малопригодным для использования в ЭВМ, где простые арифметические операции должны обладать минимальными задержками. Тем не менее описанный метод вычисления квадратного корня применялся в ЭВМ ZX Spectrum.
Итеративный метод с двумя переменными
[править | править код]Этот метод применим для поиска квадратного корня из и лучше всего сходится для . Это, однако, не является существенным ограничением для вычислений на компьютерах, поскольку в представлениях двоичных чисел с плавающей запятой и с фиксированной запятой тривиально умножить на целую степень числа 4, с последующей коррекцией на нужную степень 2 путём изменения экспоненты или сдвигом соответственно. Таким образом, может быть сдвинуто в пределы . Более того, приведённый ниже метод не использует делений общего вида, а только сложение, вычитание, умножение и деление на степень двойки. Последнее из этих действий тривиально реализуется. Недостатком метода является накопление ошибки, в отличие от итеративных методов с одной переменной, таких как вавилонский.
Начальный шаг метода
Итерационные шаги
Тогда (при ).
Заметим, что сходимость , а потому и , квадратична.
Доказательство метода достаточно простое. Сначала перепишем итерационное определение как
- .
Теперь «в лоб» доказывается, что
а потому сходимость к желаемому результату обеспечивается сходимостью к 0, что, в свою очередь, вытекает из .
Этот метод разработали около 1950 года М. В. Уилкс, Д. Дж. Уилер и С. Гилл[12] для использования в EDSAC, одном из первых электронных компьютеров[13]. Позднее метод был обобщён на неквадратные корни[14].
Итеративные методы вычисления обратного к квадратному корню числа
[править | править код]Далее приведены итеративные методы вычисления обратного к квадратному корню из S числа, то есть . Если такое значение найдено, находим просто умножением: . Эти итерации используют только умножение и не используют деления. Потому методы быстрее, чем вавилонский метод. Однако методы нестабильны, если начальное значение не близко к обратному к корню значению, итерации расходятся. Поэтому может быть выгодным сначала сделать итерацию вавилонским методом для грубой оценки корня перед началом использования этих методов.
- Применение метода Ньютона для уравнения даёт метод, который сходится квадратично и использует три умножения на каждом шаге:
- Другая итерация получается из метода Галлея[англ.], которая является методом Хаусхолдера[англ.] второго порядка. Метод сходится кубически, но использует пять умножений на итерацию:
- .
- Если работаем с числами с фиксированной запятой, умножение на 3 и деление на 8 можно реализовать сдвигами и сложениями. При работе с плавающей запятой метод Галлея можно свести к четырём умножениям на итерацию путём предварительного вычисления и поправки всех других констант для компенсации:
- ,
- .
Алгоритм Гольдшмидта
[править | править код]Некоторые компьютеры используют алгоритм Гольдшмидта для одновременного вычисления и . Алгоритм Гольдшмидта находит быстрее, чем итерация Ньютона-Рапсона, на компьютерах с операциями совмещённого умножения-сложения и имеющих либо конвейерный процессор плавающей запятой, либо два независимых процессора плавающей запятой[15].
Первый способ записи алгоритма Гольдшмидта начинается с
- (обычно используется поиск в таблице)
и осуществляются итерации
пока не окажется достаточно близко к 1 или не будет проведено фиксированное число итераций. Итерации сходятся к
- ,
- .
Заметим, что можно опустить вычисление или , а если оба значения желательны, то можно использовать в конце вместо вычисления на каждой итерации.
Второй способ, использующий операции совмещённого умножения-сложения начинается с
- (обычно используется поиск в таблице)
и осуществляются итерации
пока не станет достаточно близко к 0, либо не будет осуществлено фиксированное число итераций. Значения сходятся к
- .
Ряды Тейлора
[править | править код]Если N является приближением к , лучшее приближения может быть найдено использованием ряда Тейлора функции квадратного корня:
Порядок сходимости равен числу используемых членов ряда. При использовании двух членов метод эквивалентен вавилонскому методу. При использовании трёх членов каждая итерация использует почти столько же операций, сколько использует приближение Бакхшали, но сходимость слабее. Поэтому этот метод не является особенно эффективным способом вычисления. Для максимизации скорости сходимости, следует выбрать N так, чтобы было как можно меньше.
Разложение в цепную дробь
[править | править код]Квадратичные иррациональности (числа вида , где a, b и c целые числа), и, в частности, квадратные корни из целых чисел, имеют периодические цепные дроби[англ.]. Иногда целью является не нахождение численного значения квадратного корня, а его разложение в цепную дробь, а следовательно его рационального приближения. Пусть S будет положительным числом, корень из которого требуется найти. Теперь пусть a будет начальным приближением, а r будет остаточным членом, тогда мы можем записать Поскольку мы имеем , мы можем выразить квадратный корень из S как
Применяя это выражение для к знаменателю дроби, получим
Числитель/знаменатель разложения для непрерывных дробей (см. слева) затруднительно записывать, а также трудно укладывается в существующую систему форматирования документов. По этой причине была разработана специальная нотация для компактного представления целой и периодической частей непрерывных дробей. Одно из таких соглашений использует лексическую «ломаную линию» для представления черты между числителем и знаменателем, что позволяет записывать дробь горизонтально, а не вертикально:
Здесь каждая горизонтальная черта (в дроби) представлена тремя чертами — двумя вертикальными и одной горизонтальной, которые отделяют от .
Ещё более компактная нотация имеет специальный вид
Для периодических непрерывных дробей (которыми являются все квадратные корни), повторяющаяся часть указывается лишь один раз с чертой над повторяющейся частью:
Для √2 значение равно 1, так что представлением будет
Следуя этим путём мы получаем обобщённую непрерывную дробь[англ.] для квадратного корня
Первым шагом вычисления такой дроби для получения квадратного корня является подстановки для корня и выбор числа знаменателей. Например, в канонической форме равен 1 и для √2, равен 1, так что численно непрерывной дробью для 3 знаменателей будет
Шаг 2. Непрерывная дробь свёртывается снизу вверх, один знаменатель за раз, чтобы получить рациональную дробь, числитель и знаменатель которой являются целыми числами. Процесс свёртывания тогда выглядит следующим образом (беря первые три знаменателя):
Наконец (шаг 3), делим числитель на знаменатель рациональной дроби, чтобы получить приближённое значение корня:
- округлено до трёх знаков.
Действительное значение корня √2 равно 1,41 с точностью до трёх значащих цифр. Относительная ошибка равна 0,17%, так что рациональная дробь хороша почти до трёх знаков. Если брать больше знаменателей, получим последовательное улучшение приближения — четыре знаменателя дают дробь , что даёт почти 4 цифры точности, и т.д.
Непрерывные дроби доступны в таблицах по меньшей мере для малых чисел и общеизвестных констант. Для произвольных чисел в десятичной системе счисления предварительно вычисленные значения, скорее всего, бесполезны. Следующая таблица малых рациональных дробей, называемых подходящими дробями, полученных из канонических непрерывных дробей для нескольких констант:
√S | цепная дробь | ~десятичное | Подходящие дроби |
---|---|---|---|
√2 | 1,41421 | ||
√3 | 1,73205 | ||
√5 | 2,23607 | ||
√6 | 2,44949 | ||
√10 | 3,16228 | ||
1,77245 | |||
1,64872 | |||
1,27202 |
Примечание: Перечислены все подходящие дроби вплоть до знаменателя 99.
В общем виде чем больше знаменатель рациональной дроби, тем лучше аппроксимация. Также можно доказать, что отсечение непрерывной дроби приводит к рациональной дроби, с лучшим приближением к корню любой дроби со знаменателем, меньшим или равным знаменателю этой дроби. Например, никакая дробь со знаменателем, не превосходящем 70, не будет так же хороша, как аппроксимация к √2 числом 99/70.
Метод последовательности Люка
[править | править код]Последовательность Люка первого рода определяется рекуррентным отношением
и его характеристическим многочленом является
, он имеет дискриминант и корни
Всё это даёт следующее положительное значение
. Так что если мы хотим получить , мы можем выбрать и , а затем вычислить используя и для больших значений . Наиболее эффективный способ вычисления и —
Итог:
а тогда при :
Аппроксимации, зависящие от представления в виде числа с плавающей запятой
[править | править код]Число представляется в виде числа с плавающей запятой как . Этот формат записи называется также экспоненциальной записью. Квадратный корень из этого числа равен и аналогичные формулы могут быть представлены для кубических корней и логарифмов. Это не упрощает задачу, но если требуется только аппроксимация, то является хорошей оценкой порядка мантиссы. Далее, понимаем, что некоторые степени p могут оказаться нечётными, тогда для вместо работы с дробными степенями основания умножаем на него и вычитаем единицу из степени, делая её чётной. Уточнённое представление превращается в , так что квадратный корень будет равен .
Если взять лишь целую часть мантиссы, она может принимать значения от 1 до 99 и это можно использовать в качестве индекса в таблице из 99 предварительно вычисленных корней для завершения оценки. Компьютер, использующий шестнадцатеричное основание может потребовать большей таблицы, но при использовании основания 2 таблица будет состоять лишь из трёх величин — возможными битами целой части уточнённого представления мантиссы могут быть 01 (если степень чётная, так что нет никакого сдвига, и заметим, что нормализованное число с плавающей точкой всегда имеет ненулевую старшую цифру), или, если степень была нечётной, 10 или 11, это два первых бита исходной мантиссы. Тогда 6,25 (= 110,01 в двоичном представлении) нормализуется к с чётной степенью, так что парой битов мантиссы будет 01, в то время как 0,625 (= 0,101 в двоичном представлении) нормализуется к с нечётной степенью, так что требуется преобразование числа к , а тогда парой бит будет 10. Заметим, что младший бит порядка отражается в старший бит сгруппированной парами мантиссы. Чётная степень имеет нулевой младший бит и уточнённая мантисса будет начинаться с нуля, в то время как нечётная степень имеет 1 в младшем бите и уточнённая мантисса будет начинаться с 1. Таким образом, когда степень делится пополам, это эквивалентно тому, что младший бит порядка сдвигается в первый бит попарно сгруппированной мантиссы.
Таблица с тремя элементами может быть расширена для включения дополнительных бит мантиссы. Однако в случае компьютеров вместо вычисления интерполяции в таблице часто лучше искать более простой способ вычислений, дающий те же результаты. Всё теперь зависит от точных деталей формата представления чисел и от операций, которые доступны для получения частей числа и работы с ними. Например, Фортран содержит функцию EXPONENT(x)
для получения степени. Усилия, потраченные на получение хорошего начального приближения окупаются за счёт исключения дополнительных итераций процесса уточнения, которые потребовались бы в случае плохого приближения.
Многие компьютеры следуют стандарту IEEE для чисел с плавающей запятой[англ.] (или достаточно близкое представление) и очень быстрое приближение для квадратного корня может быть получено в качестве стартового значения метода Ньютона. Техника данного приближения вытекает из факта, что формат плавающего числа (по основанию два) аппроксимирует логарифм по основанию 2. То есть,
Так что для 32-битного числа с плавающей запятой в формате IEEE (в котором степень имеет смещение[англ.] на 127[16]) вы можете получить приближённый логарифм путём интерпретации числа как 32-битного целого, умножения его на и вычета смещения 127, то есть
Например, число 1,0 в шестнадцатеричной системе имеет вид 0x3F800000, что можно представить как , если рассматривать его как целое. Используя вышеприведённую формулу вы получите , как и ожидалось от . Аналогичным образом вы получите 0,5 из 1,5 (=0x3FC00000).
Чтобы получить квадратный корень, делим логарифм на 2 и преобразуем результат обратно. Ниже программа демонстрирует идею. Заметим, что младший бит порядка намеренно переводится в мантиссу. Одним из способов обоснования шагов этой программы, в предположении что является смещением степени, а является числом запоминаемых бит в мантиссе, заключается в доказательстве
/* Предполагаем, что плавающее число имеет формат IEEE 754 */
#include <stdint.h>
float sqrt_approx(float z)
{
union { float f; uint32_t i; } val = {z}; /* Преобразуем тип не меняя битового представления */
/*
* Для обоснования работы кода докажите, что
* ((((val.i / 2^m) - b) / 2) + b) * 2^m = ((val.i - 2^m) / 2) + ((b + 1) / 2) * 2^m)
* где
* b = смещение степени
* m = число бит в мантиссе
*/
val.i -= 1 << 23; /* Вычитаем 2^m. */
val.i >>= 1; /* Делим на 2. */
val.i += 1 << 29; /* Добавляем ((b + 1) / 2) * 2^m. */
return val.f; /* Интерпретируем снова как плавающее */
}
Три арифметические операции, образующие ядро функции можно представить в одну строку. Дополнительное уточнение может быть добавлено для уменьшения максимальной относительной ошибки. Таким образом, три операции, не включая приведение к вещественному, можно переписать как
val.i = (1 << 29) + (val.i >> 1) - (1 << 22) + a;
где a — смещение для уменьшения ошибок аппроксимации. Например, с a = 0 результаты точны для чётных степеней двойки 2 (например, 1,0), но для других чисел результат будет несколько великоват (например, 1,5 для 2,0 вместо 1,414... с ошибкой 6%). При a = −0x4B0D2 максимальная относительная ошибка сокращается до ±3,5%.
Если приближение нужно использовать как начальное значение для метода Ньютона в уравнении , то обратная форма, показанная в следующем разделе, предпочтительнее.
Обратное значение квадратного корня
[править | править код]Вариант описанной выше процедуры представлен ниже и он может быть использован для вычисления обратного к квадратному корню, то есть . Этот вариант написал Грег Уолш. Приближение сдвигом даёт относительную ошибку менее 4% и ошибка уменьшается до 0,15% после одной итерации метода Ньютона[17]. В компьютерной графике это очень эффективный способ нормализации вектора.
float invSqrt(float x) {
float xhalf = 0.5f * x;
union {
float x;
int i;
} u;
u.x = x;
u.i = 0x5f375a86 - (u.i >> 1);
/* Следующая строка может быть повторена произвольное число раз для увеличения точности */
u.x = u.x * (1.5f - xhalf * u.x * u.x);
return u.x;
}
Некоторые СБИС реализуют нахождение обратной величины к квадратному корню с помощью полиномиальной оценки с последующей итерацией Голдшмидта[18].
Корень из отрицательного или комплексного числа
[править | править код]Если , то его главный корень равен
Если , где a и b вещественные числа и , то его главный корень равен
Это можно проверить возведением в квадрат[19][20]. Здесь
является модулем числа S. Главный корень комплексного числа определяется как корень с неотрицательной вещественной частью.
См. также
[править | править код]Примечания
[править | править код]- ↑ Кроме главного корня имеется отрицательный квадратный корень, равный по модулю главному корню, но с противоположным знаком, за исключением случая нуль, когда имеется два одинаковых корня, равных нулю.
- ↑ Множители два и шесть используются ввиду того, что они аппроксимируют среднее геометрическое нижнего и верхнего возможных значений с заданным числом знаков: и .
- ↑ Неокруглённая оценка имеет максимальную абсолютную ошибку 2,65 в точке 100 и максимальную относительную ошибку в 26,5% в точках y=1, 10 и 100
- ↑ Если число находится ровно посередине между двумя квадратами, наподобие 30,5, берём большее число, которое в нашем случае 6
- ↑ Это уравнение касательной прямой к y=x2 в точке y=1.
- ↑ Fowler, Robson, 1998, с. 376.
- ↑ Heath, 1921, с. 323–324.
- ↑ Bailey, Borwein, 2012, с. 646–657.
- ↑ Bucking down to the Bakhshali manuscript . Simply Curious blog (5 июня 2018). Дата обращения: 21 декабря 2020. Архивировано 26 октября 2020 года.
- ↑ Fast integer square root by Mr. Woo's abacus algorithm (archived)
- ↑ Integer Square Root function . Дата обращения: 30 декабря 2021. Архивировано 30 сентября 2007 года.
- ↑ Wilkes, Wheeler, Gill, 1951.
- ↑ Campbell-Kelly, 2009.
- ↑ Gower, 1958, с. 142–143, 1958.
- ↑ Markstein, Peter (November 2004). Software Division and Square Root Using Goldschmidt's Algorithms (PDF). 6th Conference on Real Numbers and Computers. Dagstuhl, Germany. CiteSeerX 10.1.1.85.9648. Архивировано (PDF) 28 апреля 2022. Дата обращения: 30 декабря 2021.
- ↑ К экспоненте числа добавляется 127, что позволяет интерпретировать экспоненту как число без знака.
- ↑ Fast Inverse Square Root Архивная копия от 6 февраля 2009 на Wayback Machine by Chris Lomont
- ↑ "High-Speed Double-Precision Computation of Reciprocal, Division, Square Root and Inverse Square Root" by José-Alejandro Piñeiro and Javier Díaz Bruguera 2002 (abstract)
- ↑ Abramowitz, Stegun, 1964, с. 17.
- ↑ Cooke, 2008, с. 59.
Литература
[править | править код]- David Fowler, Eleanor Robson. Square Root Approximations in Old Babylonian Mathematics: YBC 7289 in Context // Historia Mathematica. — 1998. — Т. 25, вып. 4. — doi:10.1006/hmat.1998.2209.
- Thomas Little Heath. A History of Greek Mathematics. — Oxford: Clarendon Press, 1921. — Т. 2. — С. 323–324.
- David Bailey, Jonathan Borwein. Ancient Indian Square Roots: An Exercise in Forensic Paleo-Mathematics // American Mathematical Monthly. — 2012. — Т. 119, вып. 8.
- Miltonn Abramowitz, Irene A. Stegun. Section 3.7.26 // Handbook of mathematical functions with formulas, graphs, and mathematical tables. — Courier Dover Publications, 1964. — С. 17. — ISBN 978-0-486-61272-0.
- J. C. Gower. A Note on an Iterative Method for Root Extraction // The Computer Journal. — 1958. — Т. 1 1, вып. 3.
- M. Campbell-Kelly. Origin of Computing // Scientific American. — 2009. — Сентябрь.
- Roger Cooke. Classical algebra: its nature, origins, and uses. — John Wiley and Sons, 2008. — ISBN 978-0-470-25952-8.
- M. V. Wilkes, D. J. Wheeler, S. Gill. The Preparation of Programs for an Electronic Digital Computer. — Addison-Wesley, 1951.